package org.example.client;

import org.example.annotation.Component;

import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class ComponentScan {
    public static void main(String[] args) throws Exception{

        Map<String,Object> beanMap = new HashMap<>();


        // 给定一个包名，里面的类有的有注解，有的没有注解，扫描整个包，如果有注解，实例化对象，然后放到map集合中
        String packageName = "org.example.bean";
        // 扫描程序
        //.正则表达式代表任意字符，这个"."必须是一个字符，而不是正则表达式的"."
        String packagePath = packageName.replaceAll("\\.","/");
        // System.out.println(packagePath);
        // ClassLoader.getSystemClassLoader().getResource()获取系统类加载器，从根路径下加载资源
        URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
        String path = url.getPath();
        // System.out.println(path);
        // 获取一个绝对路径下的所有文件
        File file = new File(path);
        File[] files = file.listFiles();
        Arrays.stream(files).forEach(f ->{
            try {
                // 获取文件名
                // System.out.println(f.getName());
                // 获取类名
                // System.out.println(f.getName().split("\\.")[0]);
                String className = packageName + "." + f.getName().split("\\.")[0];
                // System.out.println(className);
                // 通过反射机制解析注解
                Class<?> aClass = Class.forName(className);
                // 判断类上是否有这个注解
                if(aClass.isAnnotationPresent(Component.class)) {
                    // 获取注解
                    Component annotation = aClass.getAnnotation(Component.class);
                    String id = annotation.value();
                    // 创建对象
                    Object o = aClass.newInstance();
                    beanMap.put(id,o);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        });

        System.out.println(beanMap);
    }
}
